package edu.client;

import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTMLTable.Cell;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextBox;

import edu.client.ComprasService.ComprasService;
import edu.client.ComprasService.ComprasServiceAsync;
import edu.client.IngenieriaService.IngenieriaService;
import edu.client.IngenieriaService.IngenieriaServiceAsync;
import edu.shared.DTO.MedidaVariableEstandarDTO;
import edu.shared.DTO.ProductoDTO;
import edu.shared.DTO.ProveedorDTO;

public class P_EditarProducto extends Composite{
	private TextBox tbMedidaVariable1;
	private TextBox tbMedidaVariable2;
	
	private FlexTable ftMedidas;
		
	//columnas para la tabla dimensiones
	private static final int COL_MEDIDA_1 = 0;
	private static final int COL_MEDIDA_2 = 1;
	private static final int COL_ELIMINAR_MEDIDA = 2;
		
	private ListBox cbProveedor;
	
	private FlexTable ftProveedores;
	
	//columnas para la tabla proveedores
	private static final int COL_NOMBRE = 0;
	private static final int COL_RUBRO = 1;
	private static final int COL_TELEFONO = 2;
	private static final int COL_MAIL = 3;
	private static final int COL_MAS_INFO = 4;
	private static final int COL_ELIMINAR_PROVEEDOR = 5;
	
	private TabPanel tbPadre;
	private IngenieriaServiceAsync ingenieriaService;
	private List<String> nombresProveedores;
	private List<MedidaVariableEstandarDTO> medidas;
	private List<ProveedorDTO> proveedores;
	private ProductoDTO producto;
	
	private Button btnConfirmarCambios;
	
	public P_EditarProducto(TabPanel padre, ProductoDTO p) {
		
		this.producto = p;
		tbPadre = padre;
		ingenieriaService = GWT.create(IngenieriaService.class);
		proveedores = new LinkedList<ProveedorDTO>();
		medidas = producto.getMedidasEstandar();
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "1100px");
		
		Label lblDetalleProducto = new Label("DETALLE DEL PRODUCTO");
		lblDetalleProducto.setStyleName("labelTitulo");
		layoutPanel.add(lblDetalleProducto);
		layoutPanel.setWidgetLeftWidth(lblDetalleProducto, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblDetalleProducto, 15.0, Unit.PX, 50.0, Unit.PX);
		
		//generamos el código del producto
		String codigoProducto = completarCeros(producto.getElemento().getClase().getCodigo()) + "-" + 
								completarCeros(producto.getElemento().getCodigo()) + "-" + 
								completarCeros(producto.getMaterial().getCodigo()) + "-" +
								completarCeros(producto.getMedidaFija().getCodigo());
		
		Label codigoLabel = new Label("CÓDIGO:");
		codigoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		codigoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(codigoLabel);
		layoutPanel.setWidgetLeftWidth(codigoLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(codigoLabel, 80.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox codigoTB = new TextBox();
		layoutPanel.add(codigoTB);
		layoutPanel.setWidgetLeftWidth(codigoTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(codigoTB, 75.0, Unit.PX, 32.0, Unit.PX);
		codigoTB.setText(codigoProducto);
		codigoTB.setEnabled(false);
		
		Label claseLabel = new Label("CLASE:");
		claseLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		claseLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(claseLabel);
		layoutPanel.setWidgetLeftWidth(claseLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseLabel, 130.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox claseTB = new TextBox();
		layoutPanel.add(claseTB);
		layoutPanel.setWidgetLeftWidth(claseTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseTB, 125.0, Unit.PX, 32.0, Unit.PX);
		claseTB.setText(producto.getElemento().getClase().getNombre());
		claseTB.setEnabled(false);
		
		Label elementoLabel = new Label("ELEMENTO:");
		elementoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		elementoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(elementoLabel);
		layoutPanel.setWidgetLeftWidth(elementoLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(elementoLabel, 130.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox elementoTB = new TextBox();
		layoutPanel.add(elementoTB);
		layoutPanel.setWidgetLeftWidth(elementoTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(elementoTB, 125.0, Unit.PX, 32.0, Unit.PX);
		elementoTB.setText(producto.getElemento().getNombre());
		elementoTB.setEnabled(false);
		
		Label materialLabel = new Label("MATERIAL:");
		materialLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		materialLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(materialLabel);
		layoutPanel.setWidgetLeftWidth(materialLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(materialLabel, 180.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox materialTB = new TextBox();
		layoutPanel.add(materialTB);
		layoutPanel.setWidgetLeftWidth(materialTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(materialTB, 175.0, Unit.PX, 32.0, Unit.PX);
		materialTB.setText(producto.getMaterial().getNombre());
		materialTB.setEnabled(false);
		
		Label medidaFijaLabel = new Label("MEDIDA FIJA:");
		medidaFijaLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		medidaFijaLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(medidaFijaLabel);
		layoutPanel.setWidgetLeftWidth(medidaFijaLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(medidaFijaLabel, 180.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox medidaFijaTB = new TextBox();
		layoutPanel.add(medidaFijaTB);
		layoutPanel.setWidgetLeftWidth(medidaFijaTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(medidaFijaTB, 175.0, Unit.PX, 32.0, Unit.PX);
		medidaFijaTB.setText(producto.getMedidaFija().getMedida());
		medidaFijaTB.setEnabled(false);
			
		Label lblMedidaProducto = new Label("MEDIDAS DEL PRODUCTO");
		lblMedidaProducto.setStyleName("labelTitulo");
		layoutPanel.add(lblMedidaProducto);
		layoutPanel.setWidgetLeftWidth(lblMedidaProducto, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblMedidaProducto, 205.0, Unit.PX, 50.0, Unit.PX);
		
		Label lblDimesion = new Label("DIMENSIÓN MEDIDA VARIABLE:");
		lblDimesion.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblDimesion);
		layoutPanel.setWidgetLeftWidth(lblDimesion, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblDimesion, 275.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox dimensionTB = new TextBox();
		layoutPanel.add(dimensionTB);
		layoutPanel.setWidgetLeftWidth(dimensionTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(dimensionTB, 270.0, Unit.PX, 32.0, Unit.PX);
		dimensionTB.setText(producto.getElemento().getTipoDimension());
		dimensionTB.setEnabled(false);
		
		Label lblMedidaVariable = new Label("MEDIDA VARIABLE:");
		lblMedidaVariable.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblMedidaVariable);
		layoutPanel.setWidgetLeftWidth(lblMedidaVariable, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblMedidaVariable, 275.0, Unit.PX, 19.0, Unit.PX);
		
		tbMedidaVariable1 = new TextBox();
		layoutPanel.add(tbMedidaVariable1);
		layoutPanel.setWidgetLeftWidth(tbMedidaVariable1, 70.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(tbMedidaVariable1, 270.0, Unit.PX, 32.0, Unit.PX);
							
		Label porLb = new Label("X");
		porLb.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		layoutPanel.add(porLb);
		layoutPanel.setWidgetLeftWidth(porLb, 80.0, Unit.PCT, 5.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(porLb, 275.0, Unit.PX, 19.0, Unit.PX);
		
		tbMedidaVariable2 = new TextBox();
		layoutPanel.add(tbMedidaVariable2);
		layoutPanel.setWidgetLeftWidth(tbMedidaVariable2, 85.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(tbMedidaVariable2, 270.0, Unit.PX, 32.0, Unit.PX);
	
		Button btnAgregarMedida = new Button("");
		
		//cuando se presiona el botón agregar
		btnAgregarMedida.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				cargarMedidaATabla();
			}
		});
		btnAgregarMedida.setText("AGREGAR");
		layoutPanel.add(btnAgregarMedida);
		layoutPanel.setWidgetLeftWidth(btnAgregarMedida, 45.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(btnAgregarMedida, 315.0, Unit.PX, 28.0, Unit.PX);
		
		ScrollPanel spMedidas = new ScrollPanel();
		spMedidas.setStyleName("tabla");
		layoutPanel.add(spMedidas);
		layoutPanel.setWidgetLeftWidth(spMedidas, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(spMedidas, 350.0, Unit.PX, 250.0, Unit.PX);
		
		ftMedidas = new FlexTable();
		spMedidas.setWidget(ftMedidas);
		ftMedidas.setSize("100%", "100%");
		
		//cargamos el encabezado de la tabla
		// columna medida variable 1
		ftMedidas.setText(0, COL_MEDIDA_1, "MEDIDA VARIABLE 1");
		ftMedidas.getCellFormatter().setWidth(0, COL_MEDIDA_1, "47.5%");
		
		// columna medida variable 2
		ftMedidas.setText(0, COL_MEDIDA_2, "MEDIDA VARIABLE 2");
		ftMedidas.getCellFormatter().setWidth(0, COL_MEDIDA_2, "47.5%");
						
		// columna eliminar
		ftMedidas.setText(0, COL_ELIMINAR_MEDIDA, "");
		ftMedidas.getCellFormatter().setWidth(0, COL_ELIMINAR_MEDIDA, "5%");
		
		// seteamos el estilo a los encabezados
		ftMedidas.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		
		Label lblProveedores = new Label("PROVEEDORES");
		lblProveedores.setStyleName("labelTitulo");
		layoutPanel.add(lblProveedores);
		layoutPanel.setWidgetLeftWidth(lblProveedores, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblProveedores, 600.0, Unit.PX, 50.0, Unit.PX);
		
		Label lblProveedor = new Label("PROVEEDOR:");
		lblProveedor.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblProveedor);
		layoutPanel.setWidgetLeftWidth(lblProveedor, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblProveedor, 670.0, Unit.PX, 19.0, Unit.PX);
		
		cbProveedor = new ListBox();
		layoutPanel.add(cbProveedor);
		layoutPanel.setWidgetLeftWidth(cbProveedor, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(cbProveedor, 665.0, Unit.PX, 32.0, Unit.PX);
		
		//al presionar el botón agregar
		Button btnAgregarProveedor = new Button("AGREGAR");
		btnAgregarProveedor.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				cargarProveedorATabla();
			}
		});
		
		layoutPanel.add(btnAgregarProveedor);
		layoutPanel.setWidgetLeftWidth(btnAgregarProveedor, 45.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(btnAgregarProveedor, 715.0, Unit.PX, 28.0, Unit.PX);
		
		ScrollPanel spProveedores = new ScrollPanel();
		spProveedores.setStyleName("tabla");
		layoutPanel.add(spProveedores);
		layoutPanel.setWidgetLeftWidth(spProveedores, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(spProveedores, 750.0, Unit.PX, 250.0, Unit.PX);
		
		ftProveedores = new FlexTable();
		spProveedores.setWidget(ftProveedores);
		ftProveedores.setSize("100%", "100%");
		
		//cargamos el encabezado de la tabla
		// columna de nombre
		ftProveedores.setText(0, COL_NOMBRE, "NOMBRE");
		ftProveedores.getCellFormatter().setWidth(0, COL_NOMBRE, "25%");
		
		// columna rubro
		ftProveedores.setText(0, COL_RUBRO, "RUBRO");
		ftProveedores.getCellFormatter().setWidth(0, COL_RUBRO, "20%");
				
		// columna teléfono
		ftProveedores.setText(0, COL_TELEFONO, "TELÉFONO");
		ftProveedores.getCellFormatter().setWidth(0, COL_TELEFONO, "20%");
				
		// columna mail
		ftProveedores.setText(0, COL_MAIL, "E-MAIL");
		ftProveedores.getCellFormatter().setWidth(0, COL_MAIL, "20%");
		
		// columna más información
		ftProveedores.setText(0, COL_MAS_INFO, "+ INFO");
		ftProveedores.getCellFormatter().setWidth(0, COL_MAS_INFO, "10%");
		
		// columna eliminar
		ftProveedores.setText(0, COL_ELIMINAR_PROVEEDOR, "");
		ftProveedores.getCellFormatter().setWidth(0, COL_ELIMINAR_PROVEEDOR, "5%");
		
		// seteamos el estilo a los encabezados
		ftProveedores.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		Label pie = new Label("");
		pie.setStyleName("labelTitulo");
		layoutPanel.add(pie);
		layoutPanel.setWidgetLeftWidth(pie, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(pie, 1000.0, Unit.PX, 50.0, Unit.PX);
		
		Button btnCancelar = new Button();
		
		//al presionar el botón cancelar
		btnCancelar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				cancelar();
			}
		});
		
		btnCancelar.setText("CANCELAR");
		layoutPanel.add(btnCancelar);
		layoutPanel.setWidgetRightWidth(btnCancelar, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnCancelar, 15.0, Unit.PX, 28.0, Unit.PX);
		
		btnConfirmarCambios = new Button();
		
		//al presionarse el botón conirmar cambios
		btnConfirmarCambios.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				btnConfirmarCambios.setEnabled(false);
				
				guardarMedidasVariablesEstandar(producto.getIdProducto());	
			}
		});
		
		btnConfirmarCambios.setText("ACEPTAR");
		layoutPanel.add(btnConfirmarCambios);
		layoutPanel.setWidgetRightWidth(btnConfirmarCambios, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnConfirmarCambios, 15.0, Unit.PX, 28.0, Unit.PX);
				
		cargarTablaMedidasVariables();
		cargarTablaProveedores();
		cargarProveedores();
		
	}
	
			
	/**
	 * Método que carga el combobox de proveedores con los proveedores cargados en la base de datos
	 */
	private void cargarProveedores()
	{
		
		ComprasServiceAsync comprasService = GWT.create(ComprasService.class);
				
		//buscamos los proveedores en la base de datos
		comprasService.buscarNombresProveedores(new AsyncCallback<List<String>>(){

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO.");				
			}

			@Override
			public void onSuccess(List<String> result) {
				nombresProveedores = result;

				//cargamos el combobox proveedores con la lista de proveedores
				for(String nombreProveedor : nombresProveedores)
					cbProveedor.addItem(nombreProveedor);
			}
			
		});
	}
	
	
	/**
	 * Método que carga en la tabla de medidas una nueva medida variable
	 */
	private void cargarMedidaATabla()
	{
		float medida1 = 0;
		float medida2 = 0;
		
		boolean error = false;
		
		//validamos las medidas del producto
		if(tbMedidaVariable1.getText().equals("")){
			Window.alert("- Complete todos los campos de la medida del producto.");
			error = true;
		}
		
		else if(tbMedidaVariable2.getText().equals("") && tbMedidaVariable2.isEnabled()){
			Window.alert("- Complete todos los campos de la medida del producto.");
			error = true;
		}
				
		if(!error){
			try{
				medida1 = Float.parseFloat(tbMedidaVariable1.getText());
						
				//si la medida1 es menor o igual que cero
				if(medida1 <= 0)
					throw new Exception();
				
				//si es una medida de dos dimensiones
				if(tbMedidaVariable2.isEnabled()){
					medida2 = Float.parseFloat(tbMedidaVariable2.getText());
					
					//si la medida2 es menor o igual que cero
					if(medida2 <= 0)
						throw new Exception();
				}
				
				MedidaVariableEstandarDTO medida = new MedidaVariableEstandarDTO();
				
				medida.setMedidaVariable1(medida1);
				medida.setMedidaVariable2(medida2);
				
				int i = 0;
				boolean encontrado = false;
				
				while(i < medidas.size() && !encontrado)
				{
					if(medidas.get(i).getMedidaVariable1() == medida1 && medidas.get(i).getMedidaVariable2() == medida2)
						encontrado = true;
					
					i++;
				}
				
				//si la medida no está en la tabla, agregamos la medida
				if(!encontrado)
				{
					// cargamos la medida a la tabla
					int numeroFila = ftMedidas.getRowCount();
					
					// columna medida 1
					ftMedidas.setWidget(numeroFila, COL_MEDIDA_1, new Label(String.valueOf(medida.getMedidaVariable1())));
					ftMedidas.getCellFormatter().setWordWrap(numeroFila, COL_MEDIDA_1, true);

					// columna medida 2
					ftMedidas.setWidget(numeroFila, COL_MEDIDA_2, new Label(String.valueOf(medida.getMedidaVariable2())));
					ftMedidas.getCellFormatter().setWordWrap(numeroFila, COL_MEDIDA_2, true);

					//creamos un label que muestra una cruz roja
					Label lblEliminar = new Label("");
					lblEliminar.setSize("16px", "16px");
					lblEliminar.setStyleName("labelBorrar");
					
					lblEliminar.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							int filaSeleccionada = ftMedidas.getCellForEvent(event).getRowIndex();
						
							eliminarMedidaDeTabla(filaSeleccionada); 
						}
					});
									
					//columna eliminar
					ftMedidas.setWidget(numeroFila, COL_ELIMINAR_MEDIDA, lblEliminar);
					ftMedidas.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_ELIMINAR_MEDIDA, HasHorizontalAlignment.ALIGN_CENTER);
					
					//seteamos el estilo de renglón de tabla
					ftMedidas.getRowFormatter().setStyleName(numeroFila, "tablaRenglon");
					
					//agregamos la medida a la lista de medidas
					medidas.add(medida);
					
					//limpiamos los campos de texto
					tbMedidaVariable1.setText("");
					tbMedidaVariable2.setText("");
				}
				
				//si ya se agregó la medida a la tabla
				else
					Window.alert("La medida ya ha sido incluída en la tabla de medidas.");
			}
			
			catch(Exception e)
			{
				Window.alert("- La medida variable del producto debeser ser un número mayor que cero.");				
			}
		}
	}
	
	/**
	 * Método que borra una fila de la tabla de medidas
	 * @param filaSeleccionada. Fila a borrar.
	 */
	private void eliminarMedidaDeTabla(int filaSeleccionada)
	{	
		//eliminamos la fila de la tabla
		ftMedidas.removeRow(filaSeleccionada);
		
		//se borra la medida de la lista de medidas.
		//se resta 1 a la fila seleccionada porque la fila 0 es el encabezado
		medidas.remove(filaSeleccionada-1);										
	}
	
	/**
	 * Método que carga un proveedor en la tabla de proveedores
	 */
	private void cargarProveedorATabla()
	{
		//obtenemos el nombre del proveedor seleccionado
		String proveedorSeleccionado = cbProveedor.getValue(cbProveedor.getSelectedIndex());
		
		//verificamos que no se cargue en la tabla dos veces el mismo proveedor
		int i = 0;
		boolean encontrado = false;
		
		while(i < proveedores.size() && !encontrado)
		{
			if(proveedores.get(i).getNombre().equals(proveedorSeleccionado))
				encontrado = true;
			
			i++;
		}
		
		
		//si el proveedor no está en la tabla de proveedores
		if(!encontrado){
		
			//buscamos los datos del proveedor necesarios para cargar la tabla
			ingenieriaService.buscarProveedor(proveedorSeleccionado, new AsyncCallback<ProveedorDTO>(){

				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO."); 
					
				}

				@Override
				public void onSuccess(ProveedorDTO result) {
					ProveedorDTO proveedor = result;
					
					// cargamos el producto a la tabla
					int numeroFila = ftProveedores.getRowCount();		
					
					//columna nombre
					ftProveedores.setWidget(numeroFila, COL_NOMBRE, new Label(proveedor.getNombre()));
					ftProveedores.getCellFormatter().setWordWrap(numeroFila, COL_NOMBRE, true);
					
					// columna rubro
					ftProveedores.setWidget(numeroFila, COL_RUBRO, new Label(proveedor.getRubro()));
					ftProveedores.getCellFormatter().setWordWrap(numeroFila, COL_RUBRO, true);

					// columna teléfono
					ftProveedores.setWidget(numeroFila, COL_TELEFONO, new Label(proveedor.getTelefono()));
					ftProveedores.getCellFormatter().setWordWrap(numeroFila, COL_TELEFONO, true);

					// columna mail
					ftProveedores.setWidget(numeroFila, COL_MAIL, new Label(proveedor.getMail()));
					ftProveedores.getCellFormatter().setWordWrap(numeroFila, COL_MAIL, true);

					// imagen más información
					Label info = new Label("");
					info.setSize("16px", "16px");
					info.setStyleName("labelInfo");	
					
					//cuando se presiona "más información"
					info.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							
							//obtenemos la celda en donde se hizo click
							Cell celda = ftProveedores.getCellForEvent(event);
							
							//obtenemos el nombre del proveedor. Restamos 1 al row index porque la fila 1 es el encabezado
							String nombreProveedor = proveedores.get(celda.getRowIndex() - 1).getNombre();
							
							cargarMasInformacionProveedor(nombreProveedor);
						}
					});
					
					// columna más información
					ftProveedores.setWidget(numeroFila, COL_MAS_INFO, info);
					ftProveedores.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_MAS_INFO, HasHorizontalAlignment.ALIGN_CENTER);
					
					//creamos un label que muestra una cruz roja
					Label lblEliminar = new Label("");
					lblEliminar.setSize("16px", "16px");
					lblEliminar.setStyleName("labelBorrar");
					
					lblEliminar.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							int filaSeleccionada = ftProveedores.getCellForEvent(event).getRowIndex();
						
							eliminarProveedorDeTabla(filaSeleccionada); 
						}
					});
									
					//columna eliminar
					ftProveedores.setWidget(numeroFila, COL_ELIMINAR_PROVEEDOR, lblEliminar);
					ftProveedores.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_ELIMINAR_PROVEEDOR, HasHorizontalAlignment.ALIGN_CENTER);
					
					//seteamos el estilo de renglón de tabla
					ftProveedores.getRowFormatter().setStyleName(numeroFila, "tablaRenglon");
					
					//agregamos el proveedor a la lista de proveedores
					proveedores.add(proveedor);
				}
				
			});
		}
		
		//si ya se había cargado el proveedor con anterioridad
		else
			Window.alert("El proveedor ya ha sido incluído en la tabla de proveedores.");
	}
	
	
	/**
	 * Método que borra una fila de la tabla de proveedores
	 * @param filaSeleccionada. Fila a borrar.
	 */
	private void eliminarProveedorDeTabla(int filaSeleccionada)
	{	
		//eliminamos la fila de la tabla
		ftProveedores.removeRow(filaSeleccionada);
		
		//se borra el proveedor de la lista de proveedores.
		//se resta 1 a la fila seleccionada porque la fila 0 es el encabezado
		proveedores.remove(filaSeleccionada-1);										
	}
	
	
	/**
	 * Método que carga todas las medidas variables estándar del producto en la tabla de medidas variables.
	 */
	private void cargarTablaMedidasVariables()
	{
		// contador de filas. Empezamos de 1 porque la fila 0 es el encabezado
		int numeroFila = 1;
					
		//por cada medida variable estándar del producto 		
		for(MedidaVariableEstandarDTO medida :  medidas)
		{
			// columna medida 1
			ftMedidas.setWidget(numeroFila, COL_MEDIDA_1, new Label(String.valueOf(medida.getMedidaVariable1())));
			ftMedidas.getCellFormatter().setWordWrap(numeroFila, COL_MEDIDA_1, true);
	
			// columna medida 2
			ftMedidas.setWidget(numeroFila, COL_MEDIDA_2, new Label(String.valueOf(medida.getMedidaVariable2())));
			ftMedidas.getCellFormatter().setWordWrap(numeroFila, COL_MEDIDA_2, true);
	
			//creamos un label que muestra una cruz roja
			Label lblEliminar = new Label("");
			lblEliminar.setSize("16px", "16px");
			lblEliminar.setStyleName("labelBorrar");
			
			lblEliminar.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					int filaSeleccionada = ftMedidas.getCellForEvent(event).getRowIndex();
				
					eliminarMedidaDeTabla(filaSeleccionada); 
				}
			});
							
			//columna eliminar
			ftMedidas.setWidget(numeroFila, COL_ELIMINAR_MEDIDA, lblEliminar);
			ftMedidas.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_ELIMINAR_MEDIDA, HasHorizontalAlignment.ALIGN_CENTER);
			
			//seteamos el estilo de renglón de tabla
			ftMedidas.getRowFormatter().setStyleName(numeroFila, "tablaRenglon");
			
			numeroFila++;
		}
	}
	
	/**
	 * Méotodo que carga la tabla de provedores con los proveedores que proveen el producto.
	 */
	private void cargarTablaProveedores()
	{
		int idProducto = producto.getIdProducto();
		ingenieriaService.buscarProveedores(idProducto, new AsyncCallback<List<ProveedorDTO>>()
		{
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO.");
				
			}

			@Override
			public void onSuccess(List<ProveedorDTO> result) {
				proveedores = result;
				
				// contador de filas. Empezamos de 1 porque la fila 0 es el encabezado.
				int numeroFila = 1;
				
				for(ProveedorDTO proveedor : proveedores)
				{
					//columna nombre
					ftProveedores.setWidget(numeroFila, COL_NOMBRE, new Label(proveedor.getNombre()));
					ftProveedores.getCellFormatter().setWordWrap(numeroFila, COL_NOMBRE, true);
					
					// columna rubro
					ftProveedores.setWidget(numeroFila, COL_RUBRO, new Label(proveedor.getRubro()));
					ftProveedores.getCellFormatter().setWordWrap(numeroFila, COL_RUBRO, true);
	
					// columna teléfono
					ftProveedores.setWidget(numeroFila, COL_TELEFONO, new Label(proveedor.getTelefono()));
					ftProveedores.getCellFormatter().setWordWrap(numeroFila, COL_TELEFONO, true);
	
					// columna mail
					ftProveedores.setWidget(numeroFila, COL_MAIL, new Label(proveedor.getMail()));
					ftProveedores.getCellFormatter().setWordWrap(numeroFila, COL_MAIL, true);
	
					// imagen más información
					Label info = new Label("");
					info.setSize("16px", "16px");
					info.setStyleName("labelInfo");	
					
					//cuando se presiona "más información"
					info.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							
							//obtenemos la celda en donde se hizo click
							Cell celda = ftProveedores.getCellForEvent(event);
							
							//obtenemos el nombre del proveedor. Restamos 1 al row index porque la fila 1 es el encabezado
							String nombreProveedor = proveedores.get(celda.getRowIndex() - 1).getNombre();
							
							cargarMasInformacionProveedor(nombreProveedor);
						}
					});
					
					// columna más información
					ftProveedores.setWidget(numeroFila, COL_MAS_INFO, info);
					ftProveedores.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_MAS_INFO, HasHorizontalAlignment.ALIGN_CENTER);
					
					//creamos un label que muestra una cruz roja
					Label lblEliminar = new Label("");
					lblEliminar.setSize("16px", "16px");
					lblEliminar.setStyleName("labelBorrar");
					
					lblEliminar.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							int filaSeleccionada = ftProveedores.getCellForEvent(event).getRowIndex();
						
							eliminarProveedorDeTabla(filaSeleccionada); 
						}
					});
									
					//columna eliminar
					ftProveedores.setWidget(numeroFila, COL_ELIMINAR_PROVEEDOR, lblEliminar);
					ftProveedores.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_ELIMINAR_PROVEEDOR, HasHorizontalAlignment.ALIGN_CENTER);
					
					//seteamos el estilo de renglón de tabla
					ftProveedores.getRowFormatter().setStyleName(numeroFila, "tablaRenglon");
					
					numeroFila++;
				}
			}	
		});
	}
	
	
	/**
	 * Método que guarda todas las medidas estándar cargadas en la tabla
	 * @param idProducto. Es el id del producto al que pertenecen las medidas estándar
	 */
	private void guardarMedidasVariablesEstandar(final int idProducto)
	{
		ingenieriaService.registrarMedidasVariablesEstandar(idProducto, medidas, new AsyncCallback<Boolean>()
		{
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO" + '\n' + '\n' + caught.getMessage());
				btnConfirmarCambios.setEnabled(true);
			}

			@Override
			public void onSuccess(Boolean result) {
				guardarInventario(idProducto);		
			}
	
		});		
	}
	
	/**
	 * Método que crea un registro del inventario del producto en la base de datos
	 * @param idProducto. Id del producto para el cual se crea el inventario.
	 */
	private void guardarInventario(final int idProducto)
	{
		ingenieriaService.registrarInventario(idProducto, medidas, new AsyncCallback<Boolean>()
		{
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO" + '\n' + '\n' + caught.getMessage());
				btnConfirmarCambios.setEnabled(true);				
			}

			@Override
			public void onSuccess(Boolean result) {
				guardarProveedoresProducto(idProducto);		
			}
	
		});		
	}
	
	/**
	 * Método que guarda en la base de datos los proveedores del producto
	 * @param idProducto. Es el id del producto que se está creando. Ya se conoce su id porque a esta
	 * altura el producto está cargado en la base de datos.
	 */
	private void guardarProveedoresProducto(int idProducto)
	{
		ingenieriaService.registrarProveedorDeProducto(idProducto, proveedores, new AsyncCallback<Boolean>()
		{
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO" + '\n' + '\n' + caught.getMessage());
				btnConfirmarCambios.setEnabled(true);
			}

			@Override
			public void onSuccess(Boolean result) {
				Window.alert("Los cambios en el producto se registraron correctamente");

				cerrarPantalla();
			}			
		});		
	}
	
	/**
	 * Método que busca toda la información de un proveedor y lo muesta en un popup
	 * @param nombreProveedor. Nombre del proveedor a buscar.
	 */
	private void cargarMasInformacionProveedor(String nombreProveedor)
	{
		ingenieriaService.buscarProveedorCompleto(nombreProveedor, new AsyncCallback<ProveedorDTO>(){
			
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}

			@Override
			public void onSuccess(ProveedorDTO result) {

				ProveedorDTO proveedor = result;
				
				//creamos el popup "más información" de proveedor
				final P_DetalleProveedor popUpMasInfo = new P_DetalleProveedor(proveedor);
				
				//seteamos sus propiedades y la mostramos en pantalla
				popUpMasInfo.setGlassEnabled(true);
				popUpMasInfo.center();
				popUpMasInfo.show();							
			}
		});
		
	}
	
	/**
	 * Método que agrega un cero a los códigos de un dígito.
	 * @param codigo. Código original.
	 * @return String. Retorna el código rellenado con el creo, si es necesario.
	 */
	private String completarCeros(int codigo)
	{
		if(codigo < 10)
			return "0"+codigo;
		
		else
			return codigo+"";
	}
	
	/**
	 * Método que cierra la pantalla de alta de producto
	 */
	private void cerrarPantalla()
	{
		tbPadre.remove(Validaciones.numeroElemento(tbPadre, "EDITAR PRODUCTO"));				
	}
	
	
	/**
	 * Método que vuelve a la pantalla inmediatamente anterior a la presente.
	 */
	 private void cancelar() {
					
		int ancho = Window.getClientWidth() - 15;
		int alto = Window.getClientHeight() - 13;
		
		P_EditarProductoSeleccion p_editarProductoSeleccion = new P_EditarProductoSeleccion(tbPadre);
		
		this.getParent().removeFromParent();
		ScrollPanel formulario = new ScrollPanel();
		formulario.setTitle("EDITAR PRODUCTO");
		formulario.setStyleName("panelFormulario");
		formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
		formulario.add(p_editarProductoSeleccion);
		tbPadre.add(formulario, "EDITAR PRODUCTO", false);
		tbPadre.selectTab(Validaciones.numeroElemento(tbPadre, "EDITAR PRODUCTO"));
		
		tbPadre.setSize((ancho - 5) + "px", (alto - 90) + "px");

		for(int i = 0; i < tbPadre.getWidgetCount(); i++) {
			tbPadre.getWidget(i).setSize((ancho - 20) + "px", (alto - 145) + "px");
		}
	 }
}